remotes::install_github("sizespectrum/mizerExperimental")
Downloading GitHub repo sizespectrum/mizerExperimental@HEAD
These packages have more recent versions available.
It is recommended to update all of them.
Which would you like to update?

1: All                                
2: CRAN packages only                 
3: None                               
4: rlang       (1.1.0 -> 1.1.1) [CRAN]
5: cachem      (1.0.7 -> 1.0.8) [CRAN]
6: later       (1.3.0 -> 1.3.1) [CRAN]
7: dplyr       (1.1.1 -> 1.1.2) [CRAN]
8: viridisLite (0.4.1 -> 0.4.2) [CRAN]
9: mizer       (2.4.0 -> 2.4.1) [CRAN]
1
rlang       (1.1.0 -> 1.1.1) [CRAN]
cachem      (1.0.7 -> 1.0.8) [CRAN]
later       (1.3.0 -> 1.3.1) [CRAN]
dplyr       (1.1.1 -> 1.1.2) [CRAN]
viridisLite (0.4.1 -> 0.4.2) [CRAN]
mizer       (2.4.0 -> 2.4.1) [CRAN]
Installing 6 packages: rlang, cachem, later, dplyr, viridisLite, mizer

  There are binary versions available but the source versions are later:
Yes
trying URL 'http://cran.ma.imperial.ac.uk/bin/macosx/contrib/4.2/rlang_1.1.1.tgz'
Content type 'application/x-gzip' length 1850629 bytes (1.8 MB)
==================================================
downloaded 1.8 MB

trying URL 'http://cran.ma.imperial.ac.uk/bin/macosx/contrib/4.2/cachem_1.0.8.tgz'
Content type 'application/x-gzip' length 67692 bytes (66 KB)
==================================================
downloaded 66 KB

trying URL 'http://cran.ma.imperial.ac.uk/bin/macosx/contrib/4.2/dplyr_1.1.2.tgz'
Content type 'application/x-gzip' length 1562742 bytes (1.5 MB)
==================================================
downloaded 1.5 MB

trying URL 'http://cran.ma.imperial.ac.uk/bin/macosx/contrib/4.2/mizer_2.4.1.tgz'
Content type 'application/x-gzip' length 2610214 bytes (2.5 MB)
==================================================
downloaded 2.5 MB

The downloaded binary packages are in
    /var/folders/31/qqbqw7111mq3qnpkzyhtwjg00000gn/T//Rtmpem1UZ0/downloaded_packages
installing the source packages ‘later’, ‘viridisLite’

trying URL 'http://cran.ma.imperial.ac.uk/src/contrib/later_1.3.1.tar.gz'
Content type 'application/x-gzip' length 63641 bytes (62 KB)
==================================================
downloaded 62 KB

trying URL 'http://cran.ma.imperial.ac.uk/src/contrib/viridisLite_0.4.2.tar.gz'
Content type 'application/x-gzip' length 1267121 bytes (1.2 MB)
==================================================
downloaded 1.2 MB

* installing *source* package ‘later’ ...
** package ‘later’ successfully unpacked and MD5 sums checked
** using staged installation
Running configure script
-latomic linker flag not needed.
** libs
clang++ -mmacosx-version-min=10.13 -std=gnu++14 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -pthread -DSTRICT_R_HEADERS  -I'/Library/Frameworks/R.framework/Versions/4.2/Resources/library/Rcpp/include' -I/usr/local/include   -fPIC  -Wall -g -O2  -c RcppExports.cpp -o RcppExports.o
clang++ -mmacosx-version-min=10.13 -std=gnu++14 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -pthread -DSTRICT_R_HEADERS  -I'/Library/Frameworks/R.framework/Versions/4.2/Resources/library/Rcpp/include' -I/usr/local/include   -fPIC  -Wall -g -O2  -c callback_registry.cpp -o callback_registry.o
In file included from callback_registry.cpp:6:
In file included from ./callback_registry.h:10:
./threadutils.h:129:9: warning: 'timespec_get' is only available on macOS 10.15 or newer [-Wunguarded-availability-new]
    if (timespec_get(&ts, TIME_UTC) != TIME_UTC) {
        ^~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/time.h:199:5: note: 'timespec_get' has been marked as being introduced in macOS 10.15 here, but the deployment target is macOS 10.13.0
int timespec_get(struct timespec *ts, int base);
    ^
./threadutils.h:129:9: note: enclose 'timespec_get' in a __builtin_available check to silence this warning
    if (timespec_get(&ts, TIME_UTC) != TIME_UTC) {
        ^~~~~~~~~~~~
1 warning generated.
clang++ -mmacosx-version-min=10.13 -std=gnu++14 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -pthread -DSTRICT_R_HEADERS  -I'/Library/Frameworks/R.framework/Versions/4.2/Resources/library/Rcpp/include' -I/usr/local/include   -fPIC  -Wall -g -O2  -c debug.cpp -o debug.o
debug.cpp:31:11: warning: variable 'res' set but not used [-Wunused-but-set-variable]
  ssize_t res = write(STDERR_FILENO, buf, n);
          ^
1 warning generated.
clang -mmacosx-version-min=10.13 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -pthread -DSTRICT_R_HEADERS  -I'/Library/Frameworks/R.framework/Versions/4.2/Resources/library/Rcpp/include' -I/usr/local/include   -fPIC  -Wall -g -O2  -c init.c -o init.o
clang++ -mmacosx-version-min=10.13 -std=gnu++14 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -pthread -DSTRICT_R_HEADERS  -I'/Library/Frameworks/R.framework/Versions/4.2/Resources/library/Rcpp/include' -I/usr/local/include   -fPIC  -Wall -g -O2  -c later.cpp -o later.o
In file included from later.cpp:1:
In file included from ./later.h:6:
In file included from ./callback_registry.h:10:
./threadutils.h:129:9: warning: 'timespec_get' is only available on macOS 10.15 or newer [-Wunguarded-availability-new]
    if (timespec_get(&ts, TIME_UTC) != TIME_UTC) {
        ^~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/time.h:199:5: note: 'timespec_get' has been marked as being introduced in macOS 10.15 here, but the deployment target is macOS 10.13.0
int timespec_get(struct timespec *ts, int base);
    ^
./threadutils.h:129:9: note: enclose 'timespec_get' in a __builtin_available check to silence this warning
    if (timespec_get(&ts, TIME_UTC) != TIME_UTC) {
        ^~~~~~~~~~~~
1 warning generated.
clang++ -mmacosx-version-min=10.13 -std=gnu++14 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -pthread -DSTRICT_R_HEADERS  -I'/Library/Frameworks/R.framework/Versions/4.2/Resources/library/Rcpp/include' -I/usr/local/include   -fPIC  -Wall -g -O2  -c later_posix.cpp -o later_posix.o
In file included from later_posix.cpp:9:
In file included from ./later.h:6:
In file included from ./callback_registry.h:10:
./threadutils.h:129:9: warning: 'timespec_get' is only available on macOS 10.15 or newer [-Wunguarded-availability-new]
    if (timespec_get(&ts, TIME_UTC) != TIME_UTC) {
        ^~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/time.h:199:5: note: 'timespec_get' has been marked as being introduced in macOS 10.15 here, but the deployment target is macOS 10.13.0
int timespec_get(struct timespec *ts, int base);
    ^
./threadutils.h:129:9: note: enclose 'timespec_get' in a __builtin_available check to silence this warning
    if (timespec_get(&ts, TIME_UTC) != TIME_UTC) {
        ^~~~~~~~~~~~
later_posix.cpp:247:13: warning: unused variable 'ret' [-Wunused-variable]
    ssize_t ret = write(dummy_pipe_in, "a", 1);
            ^
2 warnings generated.
clang++ -mmacosx-version-min=10.13 -std=gnu++14 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -pthread -DSTRICT_R_HEADERS  -I'/Library/Frameworks/R.framework/Versions/4.2/Resources/library/Rcpp/include' -I/usr/local/include   -fPIC  -Wall -g -O2  -c later_win32.cpp -o later_win32.o
clang++ -mmacosx-version-min=10.13 -std=gnu++14 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -pthread -DSTRICT_R_HEADERS  -I'/Library/Frameworks/R.framework/Versions/4.2/Resources/library/Rcpp/include' -I/usr/local/include   -fPIC  -Wall -g -O2  -c timer_posix.cpp -o timer_posix.o
In file included from timer_posix.cpp:6:
In file included from ./timer_posix.h:8:
./threadutils.h:129:9: warning: 'timespec_get' is only available on macOS 10.15 or newer [-Wunguarded-availability-new]
    if (timespec_get(&ts, TIME_UTC) != TIME_UTC) {
        ^~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/time.h:199:5: note: 'timespec_get' has been marked as being introduced in macOS 10.15 here, but the deployment target is macOS 10.13.0
int timespec_get(struct timespec *ts, int base);
    ^
./threadutils.h:129:9: note: enclose 'timespec_get' in a __builtin_available check to silence this warning
    if (timespec_get(&ts, TIME_UTC) != TIME_UTC) {
        ^~~~~~~~~~~~
1 warning generated.
clang++ -mmacosx-version-min=10.13 -std=gnu++14 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -pthread -DSTRICT_R_HEADERS  -I'/Library/Frameworks/R.framework/Versions/4.2/Resources/library/Rcpp/include' -I/usr/local/include   -fPIC  -Wall -g -O2  -c timestamp_unix.cpp -o timestamp_unix.o
clang++ -mmacosx-version-min=10.13 -std=gnu++14 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -pthread -DSTRICT_R_HEADERS  -I'/Library/Frameworks/R.framework/Versions/4.2/Resources/library/Rcpp/include' -I/usr/local/include   -fPIC  -Wall -g -O2  -c timestamp_win32.cpp -o timestamp_win32.o
clang -mmacosx-version-min=10.13 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -pthread -DSTRICT_R_HEADERS  -I'/Library/Frameworks/R.framework/Versions/4.2/Resources/library/Rcpp/include' -I/usr/local/include   -fPIC  -Wall -g -O2  -c tinycthread.c -o tinycthread.o
tinycthread.c:195:5: warning: 'timespec_get' is only available on macOS 10.15 or newer [-Wunguarded-availability-new]
    timespec_get(&cur, TIME_UTC);
    ^~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/time.h:199:5: note: 'timespec_get' has been marked as being introduced in macOS 10.15 here, but the deployment target is macOS 10.13.0
int timespec_get(struct timespec *ts, int base);
    ^
tinycthread.c:195:5: note: enclose 'timespec_get' in a __builtin_available check to silence this warning
    timespec_get(&cur, TIME_UTC);
    ^~~~~~~~~~~~
1 warning generated.
clang++ -mmacosx-version-min=10.13 -std=gnu++14 -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/Library/Frameworks/R.framework/Resources/lib -L/usr/local/lib -o later.so RcppExports.o callback_registry.o debug.o init.o later.o later_posix.o later_win32.o timer_posix.o timestamp_unix.o timestamp_win32.o tinycthread.o -pthread -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation
installing to /Library/Frameworks/R.framework/Versions/4.2/Resources/library/00LOCK-later/00new/later/libs
** R
** inst
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
** building package indices
** installing vignettes
** testing if installed package can be loaded from temporary location
** checking absolute paths in shared objects and dynamic libraries
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (later)
* installing *source* package ‘viridisLite’ ...
** package ‘viridisLite’ successfully unpacked and MD5 sums checked
** using staged installation
** R
** inst
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
*** copying figures
** building package indices
** testing if installed package can be loaded from temporary location
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (viridisLite)

The downloaded source packages are in
    ‘/private/var/folders/31/qqbqw7111mq3qnpkzyhtwjg00000gn/T/Rtmpem1UZ0/downloaded_packages’
── R CMD build ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
  
   checking for file ‘/private/var/folders/31/qqbqw7111mq3qnpkzyhtwjg00000gn/T/Rtmpem1UZ0/remotes9fe471d4489d/sizespectrum-mizerExperimental-204fc14/DESCRIPTION’ ...
  
✔  checking for file ‘/private/var/folders/31/qqbqw7111mq3qnpkzyhtwjg00000gn/T/Rtmpem1UZ0/remotes9fe471d4489d/sizespectrum-mizerExperimental-204fc14/DESCRIPTION’

  
─  preparing ‘mizerExperimental’: (345ms)

  
✔  checking DESCRIPTION meta-information

  
─  checking for LF line-endings in source and make files and shell scripts

  
─  checking for empty or unneeded directories

  
─  building ‘mizerExperimental_2.4.0.9004.tar.gz’

  
   
* installing *source* package ‘mizerExperimental’ ...
** using staged installation
** R
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
*** copying figures
** building package indices
** testing if installed package can be loaded from temporary location
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (mizerExperimental)
list<-c("tidyverse", "mizerExperimental")

lapply(list, require, character.only=T)
[[1]]
[1] TRUE

[[2]]
[1] TRUE
## create "not in" operator
'%nin%' = Negate('%in%')

decisions made while exploring:

read in simulated data

diet <- simSurveyDietcomp
Error: object 'simSurveyDietcomp' not found

formate for mizer

sp_params <- annage_wtage %>% group_by(Name) %>% summarise(w_max = max(value))
sp_params <- sp_params %>% left_join(survObsBiom[survObsBiom$year %in% 40:50,] %>% group_by(Name) %>% summarise(biomass_observed = mean(value)))
Joining with `by = join_by(Name)`
names(sp_params) <- c("species", "w_max", "biomass_observed")

add more species specific info

## get pred/prey ratio
sp_params$beta <- sp_params$w_max/ ## predator mass
  10^(-2.3 + 2.5*log10(sp_params$w_max) - 0.36*log10(sp_params$w_max)^2) ## prey mass

## add diet breadth
#sp_params <- sp_params %>% left_join(params[,c("Name", "sigma")])
sp_params$sigma <- 0.3

## get size adjusted growth parameter (currently using average)
sp_params$h <- 22
# make a dummy species interaction matrix of full interaction with everything
sp_matrix <- as.data.frame(matrix(rep(1, length(unique(sp_params$species))^2), nrow = (length(unique(sp_params$species))),
                                  dimnames = list(unique(sp_params$species), unique(sp_params$species))))

build mizer model

t <- newMultispeciesParams(species_params = sp_params,
                              #     gear_params = sp_gear,
                                   interaction = sp_matrix, 
                                   initial_effort = 1,
                                   lambda = 2.05, n = 3/4, p = 3/4)
No ks column so calculating from critical feeding level.
Using z0 = z0pre * w_max ^ z0exp for missing z0 values.
Using f0, h, lambda, kappa and the predation kernel to calculate gamma.

run to steady state

ta <- steady(t)
Convergence was achieved in 19.5 years.

calibrate to observed biomass

tb <- calibrateBiomass(ta)
tc <- matchBiomasses(tb)
Warning: For the following species `erepro` has been increased to the smallest possible value: erepro[Blue_whiting] = 0.00257; erepro[Capelin] = 0.00239; erepro[Green_halibut] = 0.0398; erepro[Haddock] = 0.0293; erepro[Long_rough_dab] = 0.0217; erepro[Mackerel] = 0.0622; erepro[North_atl_cod] = 0.0019; erepro[Norwegian_ssh] = 0.169; erepro[Polar_cod] = 0.000882; erepro[Redfish] = 0.015; erepro[Saithe] = 0.000261

check plots

plotlySpectra(tc, power = 1, total = T)
plotlySpectra(tc, power = 2, total = T)
plotBiomassVsSpecies(tc)

run to steady state again

td <- tc |>
    calibrateBiomass() |> matchBiomasses() |> matchGrowth() |> steady() |>
    calibrateBiomass() |> matchBiomasses() |> matchGrowth() |> steady() |>
    calibrateBiomass() |> matchBiomasses() |> matchGrowth() |> steady() |>
    calibrateBiomass() |> matchBiomasses() |> matchGrowth() |> steady() |>
    calibrateBiomass() |> matchBiomasses() |> matchGrowth() |> steady() 
Warning: For the following species `erepro` has been increased to the smallest possible value: erepro[Green_halibut] = 0.0398; erepro[Long_rough_dab] = 0.0217Convergence was achieved in 25.5 years.
Warning: For the following species `erepro` has been increased to the smallest possible value: erepro[Blue_whiting] = 0.00319; erepro[Capelin] = 0.00126; erepro[Green_halibut] = 0.00752; erepro[Haddock] = 0.101; erepro[Long_rough_dab] = 0.754; erepro[Mackerel] = 0.541; erepro[North_atl_cod] = 0.000392; erepro[Norwegian_ssh] = 0.0722; erepro[Polar_cod] = 0.00175; erepro[Redfish] = 0.0103; erepro[Saithe] = 0.000244Warning: For the following species `erepro` has been increased to the smallest possible value: erepro[Haddock] = 0.101; erepro[North_atl_cod] = 0.000392Convergence was achieved in 19.5 years.
Convergence was achieved in 15 years.
Convergence was achieved in 3 years.
Convergence was achieved in 3 years.
summary(td)
An object of class "MizerParams" 
Consumer size spectrum:
    minimum size:   0.001
    maximum size:   25374.6
    no. size bins:  100
Resource size spectrum:
    minimum size:   8.91616e-13
    maximum size:   9.20389
    no. size bins:  175 (221 size bins in total)
Species details:

Fishing gear details:
Gear          Effort  Target species 
 ----------------------------------
knife_edge_gear 1.00   Blue_whiting, Capelin, Green_halibut, Haddock, Long_rough_dab, Mackerel, North_atl_cod, Norwegian_ssh, Polar_cod, Redfish, Saithe 
View(td@species_params)

look at plots

plotBiomassVsSpecies(tb)

plotBiomassVsSpecies(td)

age_mat_model = age_mat(td)
age_mat_observed = sp_params$age_mat
Warning: Unknown or uninitialised column: `age_mat`.
data.frame(age_mat_model, age_mat_observed)
Error in data.frame(age_mat_model, age_mat_observed) : 
  arguments imply differing number of rows: 11, 0
plotlySpectra(tb, power = 1, total = T)
plotlySpectra(tc, power = 1, total = T)
plotlySpectra(td, power = 1, total = T)
plotlySpectra(td, power = 2, total = T)
sim <- steady(td, return_sim = TRUE, t_max = 12, t_per = 0.2)
Convergence was achieved in 0.2 years.
plotBiomass(sim)

animateSpectra(sim)
plot(sim)

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CnJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJzaXplc3BlY3RydW0vbWl6ZXJFeHBlcmltZW50YWwiKQpsaXN0PC1jKCJ0aWR5dmVyc2UiLCAibWl6ZXJFeHBlcmltZW50YWwiKQoKbGFwcGx5KGxpc3QsIHJlcXVpcmUsIGNoYXJhY3Rlci5vbmx5PVQpCgojIyBjcmVhdGUgIm5vdCBpbiIgb3BlcmF0b3IKJyVuaW4lJyA9IE5lZ2F0ZSgnJWluJScpCmBgYAoKCiMjIGRlY2lzaW9ucyBtYWRlIHdoaWxlIGV4cGxvcmluZzoKLSB1c2UgZmFsbCBiaW9tYXNzCi0gdGFrZSBhIHRlbiB5ZWFyIGF2ZXJhZ2Ugb2Ygc3VydmV5IG9ic2VydmVkIGJpb21hc3MgZnJvbSBzdGFydCBvZiB0aGUgdGltZSBzZXJpZXMKCgojIyByZWFkIGluIHNpbXVsYXRlZCBkYXRhCmBgYHtyfQpzdXJ2T2JzQmlvbSA8LSBtc2tleXJ1bjo6c2ltU3VydmV5SW5kZXggI2F0bGFudGlzb206OnJlYWRfc2F2ZWRzdXJ2cyhkLm5hbWUsICdzdXJ2QicpCiNhZ2VfY29tcF9kYXRhIDwtIG1za2V5cnVuOjpzaW1TdXJ2ZXlBZ2VMZW5jb21wICNhdGxhbnRpc29tOjpyZWFkX3NhdmVkc3VydnMoZC5uYW1lLCAnc3VydkFnZScpICNub3QgdXNpbmcgaW4gYXNzZXNzbWVudApsZW5fY29tcF9kYXRhIDwtIG1za2V5cnVuOjpzaW1TdXJ2ZXlMZW5jb21wICNhdGxhbnRpc29tOjpyZWFkX3NhdmVkc3VydnMoZC5uYW1lLCAnc3VydkxlbicpCiN3dGFnZSA8LSBhdGxhbnRpc29tOjpyZWFkX3NhdmVkc3VydnMoZC5uYW1lLCAnc3Vydld0YWdlJykgICNub3QgdXNpbmcgaW4gYXNzZXNzbWVudAphbm5hZ2VfY29tcF9kYXRhIDwtIG1za2V5cnVuOjpzaW1TdXJ2ZXlBZ2Vjb21wICNhdGxhbnRpc29tOjpyZWFkX3NhdmVkc3VydnMoZC5uYW1lLCAnc3VydkFubkFnZScpCmFubmFnZV93dGFnZSA8LSBtc2tleXJ1bjo6c2ltU3VydmV5V3RhdEFnZSAjYXRsYW50aXNvbTo6cmVhZF9zYXZlZHN1cnZzKGQubmFtZSwgJ3N1cnZBbm5XdGFnZScpCnBhcmFtcyA8LSBtc2tleXJ1bjo6c2ltQmlvbFBhcgpkaWV0IDwtIG1za2V5cnVuOjpzaW1TdXJ2ZXlEaWV0Y29tcCAKCiNhbGxfZGlldHMgPC0gYXRsYW50aXNvbTo6cmVhZF9zYXZlZHN1cnZzKGQubmFtZSwgJ3N1cnZEaWV0JykgI25vdCB1c2luZyBpbiBhc3Nlc3NtZW50CgpjYXRjaGJpb19zcyA8LSBtc2tleXJ1bjo6c2ltQ2F0Y2hJbmRleCAjYXRsYW50aXNvbTo6cmVhZF9zYXZlZGZpc2hlcmllcyhkLm5hbWUsICdDYXRjaCcpCmNhdGNobGVuX3NzIDwtIG1za2V5cnVuOjpzaW1GaXNoZXJ5TGVuY29tcCAjYXRsYW50aXNvbTo6cmVhZF9zYXZlZGZpc2hlcmllcyhkLm5hbWUsICJjYXRjaExlbiIpCiNmaXNoX2FnZV9jb21wIDwtICNhdGxhbnRpc29tOjpyZWFkX3NhdmVkZmlzaGVyaWVzKGQubmFtZSwgImNhdGNoQWdlIikKZmlzaF9hbm5hZ2VfY29tcCA8LSBtc2tleXJ1bjo6c2ltRmlzaGVyeUFnZWNvbXAgI2F0bGFudGlzb206OnJlYWRfc2F2ZWRmaXNoZXJpZXMoZC5uYW1lLCAnY2F0Y2hBbm5BZ2UnKQpmaXNoX2FubmFnZV93dGFnZSA8LSBtc2tleXJ1bjo6c2ltRmlzaGVyeVd0YXRBZ2UgI2F0bGFudGlzb206OnJlYWRfc2F2ZWRmaXNoZXJpZXMoZC5uYW1lLCAnY2F0Y2hBbm5XdGFnZScpCmBgYAoKIyMgZm9ybWF0ZSBmb3IgbWl6ZXIKYGBge3J9CnNwX3BhcmFtcyA8LSBhbm5hZ2Vfd3RhZ2UgJT4lIGdyb3VwX2J5KE5hbWUpICU+JSBzdW1tYXJpc2Uod19tYXggPSBtYXgodmFsdWUpKQpzcF9wYXJhbXMgPC0gc3BfcGFyYW1zICU+JSBsZWZ0X2pvaW4oc3Vydk9ic0Jpb21bc3Vydk9ic0Jpb20keWVhciAlaW4lIDQwOjUwLF0gJT4lIGdyb3VwX2J5KE5hbWUpICU+JSBzdW1tYXJpc2UoYmlvbWFzc19vYnNlcnZlZCA9IG1lYW4odmFsdWUpKSkKbmFtZXMoc3BfcGFyYW1zKSA8LSBjKCJzcGVjaWVzIiwgIndfbWF4IiwgImJpb21hc3Nfb2JzZXJ2ZWQiKQpgYGAKCiMjIGFkZCBtb3JlIHNwZWNpZXMgc3BlY2lmaWMgaW5mbwpgYGB7cn0KIyMgZ2V0IHByZWQvcHJleSByYXRpbwpzcF9wYXJhbXMkYmV0YSA8LSBzcF9wYXJhbXMkd19tYXgvICMjIHByZWRhdG9yIG1hc3MKICAxMF4oLTIuMyArIDIuNSpsb2cxMChzcF9wYXJhbXMkd19tYXgpIC0gMC4zNipsb2cxMChzcF9wYXJhbXMkd19tYXgpXjIpICMjIHByZXkgbWFzcwoKIyMgYWRkIGRpZXQgYnJlYWR0aAojc3BfcGFyYW1zIDwtIHNwX3BhcmFtcyAlPiUgbGVmdF9qb2luKHBhcmFtc1ssYygiTmFtZSIsICJzaWdtYSIpXSkKc3BfcGFyYW1zJHNpZ21hIDwtIDAuMwoKIyMgZ2V0IHNpemUgYWRqdXN0ZWQgZ3Jvd3RoIHBhcmFtZXRlciAoY3VycmVudGx5IHVzaW5nIGF2ZXJhZ2UpCnNwX3BhcmFtcyRoIDwtIDIyCgpgYGAKCgpgYGB7cn0KIyBtYWtlIGEgZHVtbXkgc3BlY2llcyBpbnRlcmFjdGlvbiBtYXRyaXggb2YgZnVsbCBpbnRlcmFjdGlvbiB3aXRoIGV2ZXJ5dGhpbmcKc3BfbWF0cml4IDwtIGFzLmRhdGEuZnJhbWUobWF0cml4KHJlcCgxLCBsZW5ndGgodW5pcXVlKHNwX3BhcmFtcyRzcGVjaWVzKSleMiksIG5yb3cgPSAobGVuZ3RoKHVuaXF1ZShzcF9wYXJhbXMkc3BlY2llcykpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbW5hbWVzID0gbGlzdCh1bmlxdWUoc3BfcGFyYW1zJHNwZWNpZXMpLCB1bmlxdWUoc3BfcGFyYW1zJHNwZWNpZXMpKSkpCmBgYAoKIyMgYnVpbGQgbWl6ZXIgbW9kZWwKYGBge3J9CnQgPC0gbmV3TXVsdGlzcGVjaWVzUGFyYW1zKHNwZWNpZXNfcGFyYW1zID0gc3BfcGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICBnZWFyX3BhcmFtcyA9IHNwX2dlYXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3Rpb24gPSBzcF9tYXRyaXgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfZWZmb3J0ID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEgPSAyLjA1LCBuID0gMy80LCBwID0gMy80KQpgYGAKCgojIyBydW4gdG8gc3RlYWR5IHN0YXRlCmBgYHtyfQp0YSA8LSBzdGVhZHkodCkKYGBgCiMjIGNhbGlicmF0ZSB0byBvYnNlcnZlZCBiaW9tYXNzCmBgYHtyfQp0YiA8LSBjYWxpYnJhdGVCaW9tYXNzKHRhKQp0YyA8LSBtYXRjaEJpb21hc3Nlcyh0YikKYGBgCgoKIyMgY2hlY2sgcGxvdHMKYGBge3J9CnBsb3RseVNwZWN0cmEodGMsIHBvd2VyID0gMSwgdG90YWwgPSBUKQpwbG90bHlTcGVjdHJhKHRjLCBwb3dlciA9IDIsIHRvdGFsID0gVCkKcGxvdEJpb21hc3NWc1NwZWNpZXModGMpCmBgYAoKIyMgcnVuIHRvIHN0ZWFkeSBzdGF0ZSBhZ2FpbgpgYGB7cn0KdGQgPC0gdGMgfD4KICAgIGNhbGlicmF0ZUJpb21hc3MoKSB8PiBtYXRjaEJpb21hc3NlcygpIHw+IG1hdGNoR3Jvd3RoKCkgfD4gc3RlYWR5KCkgfD4KICAgIGNhbGlicmF0ZUJpb21hc3MoKSB8PiBtYXRjaEJpb21hc3NlcygpIHw+IG1hdGNoR3Jvd3RoKCkgfD4gc3RlYWR5KCkgfD4KICAgIGNhbGlicmF0ZUJpb21hc3MoKSB8PiBtYXRjaEJpb21hc3NlcygpIHw+IG1hdGNoR3Jvd3RoKCkgfD4gc3RlYWR5KCkgfD4KICAgIGNhbGlicmF0ZUJpb21hc3MoKSB8PiBtYXRjaEJpb21hc3NlcygpIHw+IG1hdGNoR3Jvd3RoKCkgfD4gc3RlYWR5KCkgfD4KICAgIGNhbGlicmF0ZUJpb21hc3MoKSB8PiBtYXRjaEJpb21hc3NlcygpIHw+IG1hdGNoR3Jvd3RoKCkgfD4gc3RlYWR5KCkgCmBgYAoKCgpgYGB7cn0Kc3VtbWFyeSh0ZCkKVmlldyh0ZEBzcGVjaWVzX3BhcmFtcykKYGBgCgojIyBsb29rIGF0IHBsb3RzCmBgYHtyfQpwbG90QmlvbWFzc1ZzU3BlY2llcyh0YikKcGxvdEJpb21hc3NWc1NwZWNpZXModGQpCmBgYAoKCmBgYHtyfQpwbG90bHlTcGVjdHJhKHRiLCBwb3dlciA9IDEsIHRvdGFsID0gVCkKcGxvdGx5U3BlY3RyYSh0YywgcG93ZXIgPSAxLCB0b3RhbCA9IFQpCnBsb3RseVNwZWN0cmEodGQsIHBvd2VyID0gMSwgdG90YWwgPSBUKQpwbG90bHlTcGVjdHJhKHRkLCBwb3dlciA9IDIsIHRvdGFsID0gVCkKYGBgCgpgYGB7cn0Kc2ltIDwtIHN0ZWFkeSh0ZCwgcmV0dXJuX3NpbSA9IFRSVUUsIHRfbWF4ID0gMTIsIHRfcGVyID0gMC4yKQpwbG90QmlvbWFzcyhzaW0pCmFuaW1hdGVTcGVjdHJhKHNpbSkKYGBgCgoKYGBge3J9CnBsb3Qoc2ltKQpgYGAKCgoKCgoKCgoKCgo=